package game;

import java.util.Random;

import param.GameParam;

/**
 * Principale classe di un generico spowner 2D.
 * @author Jan
 *
 */
public abstract class Spawner2D extends Thread {
	private Entity2D[] entityBuffer = new Entity2D[GameParam.ENTITY_BUFFER_SIZE];
	private Entity2D[] entityBufferClone = new Entity2D[GameParam.ENTITY_BUFFER_SIZE];
	private Entity2D tmp;
	//Associa ogni entita' con la prorpio posizione nel buffer.
	private int ID = 0;
	//Indica quante Entita' sono attive
	
	private int x;
	private int y;
	private int minX, maxX;
	private int minY, maxY;
	

	public Spawner2D(int maxWidthEntities, int maaxHeightEntities, int widthRenderArea, int heightRenderArea) {
		this.minX = maxWidthEntities/2;
		this.maxX = widthRenderArea - maxWidthEntities/2;
		this.minY = maaxHeightEntities/2;
		this.maxY = heightRenderArea - maaxHeightEntities/2;
	}
	
	/**
	 * Metodo astratto per definire la routine di generazione delle entita'.
	 */
	public abstract void createEntity();
	
	/**
	 * Fornisce un nuovo ID, agiornando anche il puntatore interno del buffer.
	 * @return
	 */
	public int generateID(){
		ID++;
		if(ID >= entityBuffer.length){
			//Si ricomincia a riempire il vettore...
			ID = 0;
		}
		return ID;
	}
	
	/**
	 * Interrompe il ciclo interno nel thread dell'entita', lasciando che finisca, prima di intorrompere il thread.
	 * @param ID posizione nel buffer per recuperare l'entita' da eliminare.
	 */
	public void deleteActivity(int ID ){
		tmp = entityBuffer[ID];
		tmp.Kill();
//		entityBuffer[ID] = null;
	}
	
	/**
	 * Aggiunge un entita' al buffer.
	 * @param entity
	 */
	public void insertEntity( Entity2D entity ){
		entityBuffer[entity.getEntityID()] = entity;
	}
	
	/**
	 * Genera delle coorinate casuali all'interno dell'intera area di rendering.
	 * @return
	 */
	public Coordinate generateFullRandomCooridates(){
		Random r = new Random();
		x = r.nextInt(maxX - minX) + minY;
		y = r.nextInt(maxY - minY) + minY;
		return new Coordinate(x, y, 0);
	}
	
	/**
	 * @deprecated Restituisce una copia del buffer di entita'.
	 * @return
	 */
	public Entity2D[] getEntities() {
		return cloneActalEntityBuffer();
	}
	
	/**
	 * Restituisce una copia del buffer di entita'.
	 * @return
	 */
	public Entity2D[]  cloneActalEntityBuffer(){
		System.arraycopy(entityBuffer, 0, entityBufferClone, 0, entityBuffer.length);
		return entityBufferClone;
	}
	
	/**
	 * Restituisce la dimensione del buffer.
	 * Nota: La dimensione viene definita al caricamento del gioco.
	 * @see GameParam per le impostazioni generali
	 * @return dimensione del buffer
	 */
	public int countActiveEntities(){
		return entityBuffer.length;
	}

	
}
